package com.huitong.common.core.validator;

import com.huitong.common.core.annotation.Id;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

/**
 * id字段参数校验器
 *
 * @author fromdrowning
 * @date 2024/4/30 下午8:40
 */
public class IdValidator implements ConstraintValidator<Id, Number> {

    /**
     * id字段长度
     */
    private int length;

    /**
     * 是否允许为空
     */
    private boolean allowNull;

    /**
     * 初始化 获取到注解上的参数值
     *
     * @param constraintAnnotation id字段参数校验注解
     */
    @Override
    public void initialize(Id constraintAnnotation) {
        this.length = constraintAnnotation.type().getLength();
        this.allowNull = constraintAnnotation.allowNull();
    }

    /**
     * 参数校验
     *
     * @param id                         id字段值
     * @param constraintValidatorContext 校验器上下文
     * @return {@code true} 校验成功
     */
    @Override
    public boolean isValid(Number id, ConstraintValidatorContext constraintValidatorContext) {
        boolean isNullId = id == null;

        // 允许为空并且id也为空校验通过
        if (allowNull && isNullId) {
            return true;
        }

        // id为空或为负数校验不通过
        if (isNullId || id.intValue() < 0) {
            return false;
        }

        // id长度校验
        return String.valueOf(id).length() == length;
    }
}
